package com.zzyy.study.service.impl;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zzyy.study.entities.Pay;
import com.zzyy.study.service.PayService;
import com.zzyy.study.mapper.PayMapper;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.TransactionSynchronization;
import org.springframework.transaction.support.TransactionSynchronizationManager;

import java.util.List;

/**
* @author 阳
* @description 针对表【t_pay(支付交易表)】的数据库操作Service实现
* @createDate 2024-08-24 09:39:09
*/
@Service
public class PayServiceImpl extends ServiceImpl<PayMapper, Pay>
    implements PayService{

    @Resource
    private PayMapper payMapper;

    @Override
    @Transactional(rollbackFor = Exception.class)
    public int myInsert(Pay pay)
    {
        System.out.println(TransactionSynchronizationManager.isSynchronizationActive()
                && TransactionSynchronizationManager.isActualTransactionActive());


        if (hasTransaction())
        {
            /**
             * TransactionSynchronizationManager.registerSynchronization方法
             * 作用概述
             * 允许开发者在Spring事务中注册一个事务同步器TransactionSynchronization对象。
             * 当事务提交、回滚或完成（提交或回滚后）时，这个注册的对象会被自动调用，从而执行与事务状态相关的操作。
             * 使用registerSynchronization时需要提供一个实现了TransactionSynchronization接口的类的实例。
             * 这个接口定义了一系列回调方法，
             * 如beforeCommit、afterCommit、afterRollback等，Spring会在事务生命周期的相应阶段自动调用这些方法
             */
            TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
                @Override
                public void afterCompletion(int status) {
                    System.out.println(Thread.currentThread().getName()+"\t"+"11111");

                    new Thread(() -> {
                        System.out.println(Thread.currentThread().getName()+"\t"+"22222");
                        System.out.println("--开启了事务同步 && 并且当前确实有事务---------tx: "+ IdUtil.simpleUUID() +"\t" + DateUtil.now());
                    }).start();
                }
            });
        }

        return payMapper.insert(pay);
    }

    /**
     * 判断当前是否有事务？
     *
     * @return
     */
    private static boolean hasTransaction() {
        //开启了事务同步 && 并且当前确实有事务
        return TransactionSynchronizationManager.isSynchronizationActive()
                && TransactionSynchronizationManager.isActualTransactionActive();
    }
}




